import {isArray} from './ArrayTools.js'

/**
 * 判断是否为对象
 * @param obj
 * @returns {boolean}
 */
export function isObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]'
}

/**
 * 纯简单对象克隆
 * @param obj
 */
export function cloneSimple(obj,ignoreEmpty = false) {
    let temp = {}
    for(let key in obj){
        let oldValue = obj[key]
        if(ignoreEmpty){
            temp[key] = oldValue
        }else{
            if(oldValue !== ''){
                temp[key] = oldValue
            }
        }

    }
    return temp
}
export function cloneDeep(obj) {
    let o
    // 如果  他是对象object的话  , 因为null,object,array  也是'object';
    if (typeof obj === 'object') {
        // 如果  他是空的话
        if (obj === null) {
            o = null
        }
        else {
            // 如果  他是数组arr的话
            if (isArray(obj)) {
                o = [];
                for (let i = 0, len = obj.length; i < len; i++) {
                    o.push(cloneDeep(obj[ i ]))
                }
            }
            // 如果  他是对象object的话
            else {
                o = {};
                for (let j in obj) {
                    o[ j ] = cloneDeep(obj[ j ])
                }
            }
        }
    }
    else {
        o = obj
    }
    return o
}
/**
 * 复制属性
 * @param dest
 * @param source
 * @param ignoreProps 忽略的属性，支持字符串和数组两种
 * @returns {*}
 */
export function copyPropSimple(dest, source,ignoreProps) {
    if(!source){
        return dest
    }
    for(let key in source){
        let isIgnore = false
        if(ignoreProps){
            if (typeof ignoreProps == 'string') {
                if(key == ignoreProps){
                    isIgnore = true
                }
            }else {
                // 数组
                isIgnore = ignoreProps.some(item=>key == item)
            }
        }
        if(!isIgnore){
            dest[key] = source[key]
        }
    }
    return dest
}

/**
 * 深度获取对象属性，prop，如：a.b.c
 * @param obj
 * @param prop 字符串 属性名称
 * @returns {*}
 */
export  function getValue(obj, prop) {
    if (obj && prop) {
        let value = obj
        let key = prop.split('.')
        for (let i = 0; i < key.length; i++) {
            value = value[key[i]]
            if (value == null) {
                return null
            }
        }
        return value
    }
    return null
}

/**
 * 是否有属性
 * @param obj 纯简单对象
 * @param prop
 */
export function hasPropSimple(obj,prop) {
    return obj[prop] !== undefined
}